home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume16 / conf2 / part02 < prev    next >
Encoding:
Internet Message Format  |  1988-09-14  |  14.4 KB

  1. Subject:  v16i002:  Multi-user conference system, Part02/05
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Keith Gabryelski <ucsd!elgar!ag>
  7. Posting-number: Volume 16, Issue 2
  8. Archive-name: conf2/part02
  9.  
  10. #! /bin/sh
  11. # This is a shell archive, meaning:
  12. # 1. Remove everything above the #! /bin/sh line.
  13. # 2. Save the resulting text in a file.
  14. # 3. Execute the file with /bin/sh (not csh) to create the files:
  15. #    conf.h
  16. #    confalloc.c
  17. #    config.h
  18. #    confopts.c
  19. export PATH; PATH=/bin:$PATH
  20. if test -f 'conf.h'
  21. then
  22.     echo shar: will not over-write existing file "'conf.h'"
  23. else
  24. cat << \SHAR_EOF > 'conf.h'
  25. #include "config.h"
  26. #include <stdio.h>
  27. #include <sys/types.h>
  28. #include <ctype.h>
  29. #include <signal.h>
  30. #include <sys/stat.h>
  31. #include <pwd.h>
  32. #include <setjmp.h>
  33. #include <errno.h>
  34.  
  35. #ifdef    SYSV
  36. #include <unistd.h>
  37. #include <termio.h>
  38. #include <fcntl.h>
  39. #endif    SYSV
  40.  
  41. #ifdef    BSD
  42. #include <sgtty.h>
  43. #include <sys/ioctl.h>
  44. #include <sys/file.h>
  45.  
  46. #define    index    strchr
  47. #define    rindex    strrchr
  48. #endif    BSD
  49.  
  50.  
  51. #include "structs.h"
  52. #include "extern.h"
  53.  
  54. /*
  55.  * some ASCII values
  56.  *
  57.  */
  58.  
  59. #ifdef    CTRL
  60. #undef    CTRL
  61. #endif    CTRL
  62. #define    CTRL(c)        (c&0x1F)
  63. #define    BELL        0x07
  64. #define    BS        0x08
  65. #define    TAB        0x09
  66. #define    LF        0x0A
  67. #define    CR        0x0D
  68. #define    DEL        0x7F
  69.  
  70. /*
  71.  * some bools
  72.  *
  73.  */
  74.  
  75. #ifdef    TRUE
  76. #undef    TRUE
  77. #endif    TRUE
  78. #define    TRUE    1
  79.  
  80. #ifdef    FALSE
  81. #undef    FALSE
  82. #endif    FALSE
  83. #define    FALSE    0
  84.  
  85. #define    NEXTWORD    1
  86. #define    THEREST        2
  87.  
  88. #define    NOVIS        0
  89. #define    VIS        1
  90.  
  91. #define    forever        for ever
  92. #define    ever        (;;)
  93. SHAR_EOF
  94. fi # end of overwriting check
  95. if test -f 'confalloc.c'
  96. then
  97.     echo shar: will not over-write existing file "'confalloc.c'"
  98. else
  99. cat << \SHAR_EOF > 'confalloc.c'
  100. #include "conf.h"
  101.  
  102. /*
  103.  *    memory managment stuff.
  104.  */
  105.  
  106. char *
  107. mymalloc(size)
  108. unsigned size;
  109. {
  110.     char *p;
  111.  
  112.     if ((p = malloc(size)) == NULL)
  113.     {
  114.     (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  115.     nice_exit(-1);
  116.     }
  117.  
  118.     return p;
  119. }
  120.  
  121. char *
  122. myrealloc(p, size)
  123. char *p;
  124. unsigned size;
  125. {
  126.     if (p == NULL)
  127.     {
  128.     if ((p = malloc(size)) == NULL)
  129.     {
  130.         (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  131.         nice_exit(-1);
  132.     }
  133.     }
  134.     else if ((p = realloc(p, size)) == NULL)
  135.     {
  136.     (void) fprintf(stderr, "%s: Out of memory.\n", progname);
  137.     nice_exit(-1);
  138.     }
  139.  
  140.     return p;
  141. }
  142. SHAR_EOF
  143. fi # end of overwriting check
  144. if test -f 'config.h'
  145. then
  146.     echo shar: will not over-write existing file "'config.h'"
  147. else
  148. cat << \SHAR_EOF > 'config.h'
  149. /*
  150.  * System type.  Define only the *ONE* system that applies to you
  151.  * the most.
  152.  */
  153.  
  154. #define SYSV                /* System V and Xenix.  SCO Xenix */
  155. /*#define BSD                /* Any of the Berkeley clan */
  156.  
  157. /*
  158.  * Define SENDER as the local command to use to SEND a message.
  159.  * :rings will popen() this command giving it one user on the
  160.  * command line and its message through standard input.
  161.  *
  162.  * If you do not have a local SEND program then define this as
  163.  * "write".
  164.  */
  165.  
  166. #define SENDER    "write"        /* the local send program */
  167.  
  168. /*
  169.  * The default pager
  170.  *    maybe "more", "less", or "cat"
  171.  */
  172.  
  173. #define    DEF_PAGER    "less"        /* local pager */
  174. #define    DEF_SHELL    "csh"        /* default shell*/
  175.  
  176. /*
  177.  * User settable files.
  178.  *    Someday these files will be definable at any time during conf
  179.  */
  180.  
  181. #define    CONFLOG        "/usr/lib/conf/conflog"   /* conversation log */
  182. #define    CONFUSERS    "/usr/lib/conf/confusers" /* user log */
  183. #define    CONFHELP    "/usr/lib/conf/confhelp"  /* help file */
  184. #define    CONFLOCK    "/usr/lib/conf/conf.lock" /* lock file */
  185.  
  186. #define    DEF_RECFILE    "conf.rec"     /* default record file */
  187. #define    CONFRC        ".confrc"     /* default rc file */
  188.  
  189. #define    CONFOPTS    "CONFOPTS"          /* environment variable */
  190.  
  191. #define    FILEMASK    0600         /* filemask for CONF{USERS,LOG} */
  192.  
  193. /* Some buffer length stuff */
  194. #define    MAXNAMELEN    21
  195. #define    MAXTTYLEN    21
  196. #define    MAXCONFLINES    100     /* number of conference lines */
  197.  
  198. #define    PAGESIZ        512     /* alloc this amount at a time */
  199.  
  200. #define TABAGE        2        /* space between columns */
  201.  
  202. /*
  203.  * Some important influences.
  204.  *
  205.  * Thanks should also go out to Neil Pert for awesome percussion. -MQH
  206.  */
  207.  
  208. #define SIGNIFICANT_OTHER    "Marla Gabryelski"
  209.  
  210. #define    MUSICIAN        "Brian_Eno"
  211. #define    SONG            "Third_Uncle"
  212.  
  213. #define VERNUM            2
  214. #define PATCHLEVEL        0
  215.  
  216. #define AUTHOR            "Keith M. Gabryelski"
  217. #define ADDRESS            "ag@elgar.UUCP"
  218. #define ALTPATH            "ag@portnoy.UUCP"
  219. #define THANKS1            "ford@kenobi.UUCP (Mike Ditto)"
  220.  
  221. /*
  222.  * form strings
  223.  *
  224.  *    Meta characters for form string:
  225.  *
  226.  *    %N - Your conference name.
  227.  *    %n - Name of user sending message.
  228.  *    %m - Message users sent.
  229.  *    %T - Your tty.
  230.  *    %t - Tty of user that sent message.
  231.  *    %% - The character '%'
  232.  *
  233.  */
  234.  
  235. #define    DEF_FORM_NORM    ";;; %n (%t) - %m\n"
  236. #define    DEF_FORM_SEND    ">>> %n (%t) - %m\n"
  237. #define    DEF_FORM_INFORM    "::: %n (%t) [%m]\n"
  238. #define    DEF_FORM_LINE    "::: %n (%t) - %m\n"
  239. #define    DEF_FORM_SHOUT    "*** %n (%t) - %m\n"
  240.  
  241. /*
  242.  * You probably don't need to modify anything after this line
  243.  * unless you are debugging.
  244.  */
  245.  
  246. /*
  247.  * DEBUGx are debugging defines.
  248.  *
  249.  */
  250.  
  251. /*#define DEBUG0        /* insignificant checks around conf */
  252. /*#define DEBUG1        /* temporary debug messages */
  253.  
  254. SHAR_EOF
  255. fi # end of overwriting check
  256. if test -f 'confopts.c'
  257. then
  258.     echo shar: will not over-write existing file "'confopts.c'"
  259. else
  260. cat << \SHAR_EOF > 'confopts.c'
  261. #include "conf.h"
  262.  
  263. int set_name(), set_ptrstr();
  264.  
  265. gettcap()
  266. {
  267.     char *ptr;
  268.     char buf[1024];
  269.  
  270.     if (tgetent(buf, getenv("TERM")) == 1)
  271.     {
  272.     columns=tgetnum("co");
  273.     lines=tgetnum("li");
  274.     tcapstr("cl", &cls);
  275.     }
  276.     else
  277.     puts("Unknown terminal type.  I'll wing it.\n");
  278.  
  279.     if ((ptr = getenv("COLUMNS")) != NULL)
  280.     columns = atoi(ptr);
  281.  
  282.     if ((ptr = getenv("LINES")) != NULL)
  283.     lines = atoi(ptr);
  284.  
  285.     if ((ptr = getenv("SHELL")) != NULL)
  286.     {
  287.     shell = myrealloc(shell, strlen(ptr)+1);
  288.     (void) strcpy(shell, ptr);
  289.     }
  290.  
  291.     if ((ptr = getenv("PG")) != NULL)
  292.     {
  293.     pager = myrealloc(pager, strlen(ptr)+1);
  294.     (void) strcpy(pager, ptr);
  295.     }
  296.  
  297.     if ((ptr = getenv("PAGER")) != NULL)
  298.     {
  299.     pager = myrealloc(pager, strlen(ptr)+1);
  300.     (void) strcpy(pager, ptr);
  301.     }
  302. }
  303.  
  304. getrc()
  305. {
  306.     char *fname;
  307.     char tmp[100];
  308.     char *bp, *p;
  309.     int c;
  310.     FILE *fp;
  311.  
  312.     if (homedir == NULL)
  313.     {
  314.     (void) fprintf(stderr, "%s: Can't figure you out!  Not using %s.\n",
  315.                progname, CONFRC);
  316.     return;
  317.     }
  318.  
  319.     fname = mymalloc((unsigned)(strlen(homedir) + 1 + strlen(CONFRC) + 1));
  320.  
  321.     (void) strcpy(fname, homedir);
  322.     (void) strcat(fname, "/");
  323.     (void) strcat(fname, CONFRC);
  324.  
  325.     if ((fp = fopen(fname, "r")) == (FILE *)NULL)
  326.     {
  327.     if (errno == ENOENT)
  328.         return;                /* no confrc file...  sigh */
  329.     else
  330.     {
  331.         (void) fprintf(stderr,
  332.                "%s: Couldn't open confrc file %s (%s).\n",
  333.                progname, fname, puterr(errno));
  334.     free(fname);
  335.     exit(-1);
  336.     }
  337.     }
  338.  
  339.     forever
  340.     {
  341.     p = bp = tmp;
  342.  
  343.     while (((c = getc(fp)) != EOF) && (c != '\n'))
  344.         *p++ = c;
  345.  
  346.     if (c == EOF)
  347.         break;
  348.  
  349.     *p = '\0';
  350.  
  351.     while (isspace(*bp))
  352.         bp++;
  353.  
  354.     if ((*bp == '#') || (*bp == ';') || (*bp == '\0'))
  355.         continue;
  356.  
  357.     if (*bp == ':')            /* a colon command? */
  358.     {
  359.         linelen = strlen(bp+1);
  360.         if (!intpret(bp+1))
  361.         {
  362.         (void) printf("Invalid confrc line in %s @\"%s\".\n",
  363.                   fname,bp);
  364.         return;
  365.         }
  366.     }
  367.     else
  368.     {
  369.         if ((bp = parsestr(bp, p-bp, NEXTWORD)) == NULL)
  370.         continue;
  371.  
  372.         do
  373.         {
  374.         if ((c = setopts(bp)) != FOUNDOPT)
  375.         {
  376.             if (c == AMBIGUOUS)
  377.             (void)fputs("Ambiguous", stdout);
  378.             else
  379.             (void)fputs("Invalid", stdout);
  380.  
  381.             (void) printf(" confrc file %s @\"%s\"\n", fname, bp);
  382.             free(fname);
  383.             return;
  384.         }
  385.         } while ((bp = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
  386.     }
  387.     }
  388.  
  389.     free(fname);
  390.     (void) fclose(fp);
  391. }
  392.  
  393. getopts()
  394. {
  395.     char *ptr;
  396.     int x;
  397.  
  398.     if ((ptr = getenv("COLUMNS")) != NULL)
  399.     columns = atoi(ptr);
  400.  
  401.     if ((ptr = getenv("LINES")) != NULL)
  402.     lines = atoi(ptr);
  403.  
  404.     if ((ptr = getenv("SHELL")) != NULL)
  405.     {
  406.     shell = myrealloc(shell, strlen(ptr)+1);
  407.     (void) strcpy(shell, ptr);
  408.     }
  409.  
  410.     if ((ptr = getenv("PG")) != NULL)
  411.     {
  412.     pager = myrealloc(pager, strlen(ptr)+1);
  413.     (void) strcpy(pager, ptr);
  414.     }
  415.  
  416.     if ((ptr = getenv("PAGER")) != NULL)
  417.     {
  418.     pager = myrealloc(pager, strlen(ptr)+1);
  419.     (void) strcpy(pager, ptr);
  420.     }
  421.  
  422.     if ((ptr = getenv(CONFOPTS)) != NULL)
  423.     {
  424.     ptr = parsestr(ptr, strlen(ptr), NEXTWORD);
  425.  
  426.     do
  427.     {
  428.         if ((x = setopts(ptr)) != FOUNDOPT)
  429.         {
  430.         if (x == AMBIGUOUS)
  431.             (void)fputs("Ambiuous", stdout);
  432.         else
  433.             (void)fputs("Invalid", stdout);
  434.  
  435.         (void)printf(" %s environment variable @%s\n", CONFOPTS, ptr);
  436.         break;
  437.         }
  438.     } while ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL);
  439.     }
  440. }
  441.  
  442. setopts(opt)
  443. char *opt;
  444. {
  445.     int found;
  446.  
  447.     static struct varopts vartab[] =
  448.     {
  449.     { "banner", BOOLEAN|DISPLAY, &banner, TRUE, },
  450.     { "nobanner", BOOLEAN|DISPLAY, &banner, FALSE, },
  451.     { "!banner", BOOLEAN|NODISPLAY, &banner, FALSE, },
  452.     { "beep", BOOLEAN|DISPLAY, &beep, TRUE, },
  453.     { "nobeep", BOOLEAN|DISPLAY, &beep, FALSE, },
  454.     { "!beep", BOOLEAN|NODISPLAY, &beep, FALSE, },
  455.     { "expand8bit", BOOLEAN|DISPLAY, &expand8bit, TRUE, },
  456.     { "noexpand8bit", BOOLEAN|DISPLAY, &expand8bit, FALSE, },
  457.     { "!expand8bit", BOOLEAN|NODISPLAY, &expand8bit, FALSE, },
  458.     { "expandctrl", BOOLEAN|DISPLAY, &expandctrl, TRUE, },
  459.     { "noexpandctrl", BOOLEAN|DISPLAY, &expandctrl, FALSE, },
  460.     { "!expandctrl", BOOLEAN|NODISPLAY, &expandctrl, FALSE, },
  461.     { "inform-format", STRING|DISPLAY, (int *)&informform, POINTER, set_ptrstr, },
  462.     { "line", NUMBER|DISPLAY, &cuser.cu_line, 0, do_to, },
  463.     { "line-format", STRING|DISPLAY, (int *)&lineform, POINTER, set_ptrstr, },
  464.     { "name", STRING|DISPLAY, (int *)cuser.cu_cname, ROUTINE, set_name, },
  465.     { "normal-format", STRING|DISPLAY, (int *)&normform, POINTER, set_ptrstr, },
  466.     { "pager", STRING|DISPLAY, (int *)&pager, POINTER, set_ptrstr, },
  467.     { "recfile", STRING|DISPLAY, (int *)&recfile, POINTER, set_ptrstr, },
  468.     { "seeme", BOOLEAN|DISPLAY, &seeme, TRUE, },
  469.     { "noseeme", BOOLEAN|DISPLAY, &seeme, FALSE, },
  470.     { "!seeme", BOOLEAN|NODISPLAY, &seeme, FALSE, },
  471.     { "seemyinform", BOOLEAN|DISPLAY, &informe, TRUE, },
  472.     { "noseemyinform", BOOLEAN|DISPLAY, &informe, FALSE, },
  473.     { "!seemyinform", BOOLEAN|NODISPLAY, &informe, FALSE, },
  474.     { "send-format", STRING|DISPLAY, (int *)&sendform, POINTER, set_ptrstr, },
  475.     { "shell", STRING|DISPLAY, (int *)&shell, POINTER, set_ptrstr, },
  476.     { "shout-format", STRING|DISPLAY, (int *)&shoutform, POINTER, set_ptrstr, },
  477.     { NULL, }
  478.     }, *varptr, *keepptr;
  479.  
  480.     if (opt == NULL)
  481.     {
  482.     char *string;
  483.     int tmp;
  484.     int len=0;
  485.  
  486.     for (varptr = vartab; varptr->name != NULL; varptr++)
  487.         if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
  488.         if ((tmp = strlen(varptr->name)) > len)
  489.             len = tmp;
  490.  
  491.     len += TABAGE;
  492.  
  493.     (void)fputs("Boolean flags:\n\n", stdout);
  494.  
  495.     for (varptr = vartab; varptr->name != NULL; varptr++)
  496.         if ((varptr->type == BOOLEAN) && (*varptr->var == varptr->extra))
  497.         colprnt(varptr->name, len);
  498.  
  499.     terpri();
  500.  
  501.     len = 0;
  502.  
  503.     for (varptr = vartab; varptr->name != NULL; varptr++)
  504.         if (varptr->type == NUMBER)
  505.         if ((tmp = strlen(varptr->name)+1+declen(varptr->var)) > len)
  506.             len = tmp;
  507.  
  508.     len += TABAGE;
  509.  
  510.     (void)fputs("\nNumeric options:\n\n", stdout);
  511.  
  512.     string = mymalloc((unsigned)(len+1));
  513.     for (varptr = vartab; varptr->name != NULL; varptr++)
  514.         if (varptr->type == NUMBER)
  515.         {
  516.         (void) sprintf(string, "%s=%d", varptr->name, *varptr->var);
  517.         colprnt(string, len);
  518.         }
  519.  
  520.     terpri();
  521.  
  522.     len = 0;
  523.  
  524.     for (varptr = vartab; varptr->name != NULL; varptr++)
  525.         if (varptr->type == STRING)
  526.         if (varptr->extra&POINTER)
  527.         {
  528.             if ((tmp=strlen(varptr->name) + vislen(*varptr->var)+3) > len)
  529.             len = tmp;
  530.         }
  531.         else
  532.         {
  533.             if ((tmp= strlen(varptr->name) + vislen(varptr->var)+3) > len)
  534.             len = tmp;
  535.         }
  536.  
  537.     len += TABAGE;
  538.  
  539.     (void)fputs("\nString options:\n\n", stdout);
  540.  
  541.     string = myrealloc(string, (unsigned)(len+1));
  542.     for (varptr = vartab; varptr->name != NULL; varptr++)
  543.         if (varptr->type == STRING)
  544.         {
  545.         if (varptr->extra&POINTER)
  546.             (void) sprintf(string, "%s=\"%s\"", varptr->name,
  547.                 *varptr->var);
  548.         else
  549.             (void) sprintf(string, "%s=\"%s\"", varptr->name,
  550.                 varptr->var);
  551.         colprnt(string, len);
  552.         }
  553.  
  554.     terpri();
  555.     free(string);
  556.  
  557.     return FOUNDOPT;
  558.     }
  559.  
  560.     keepptr = (struct varopts *)NULL;
  561.     found = 0;
  562.     for (varptr = vartab; varptr->name != NULL; varptr++)
  563.     if (!strncmp(varptr->name, opt, strlen(opt)))
  564.     {
  565.         if (!found)
  566.         keepptr = varptr;
  567.  
  568.         if (found >= 0)
  569.         ++found;
  570.  
  571.         if (strlen(varptr->name) == strlen(opt))
  572.         {
  573.         found = -1;
  574.         keepptr = varptr;
  575.         }
  576.     }
  577.  
  578.     if (!found)
  579.     return NOOPT;
  580.  
  581.     if (found > 1)
  582.     return AMBIGUOUS;
  583.  
  584.     switch(keepptr->type&VARMASK)
  585.     {
  586.     case BOOLEAN:
  587.         *keepptr->var = keepptr->extra;
  588.         break;
  589.  
  590.     case NUMBER:
  591.         return (*keepptr->var_func)(keepptr->name, keepptr->var);
  592.  
  593.     case STRING:
  594.         return (*keepptr->var_func)(keepptr->name, keepptr->var);
  595.  
  596.     default:
  597.         return NOOPT;
  598.     }
  599.  
  600.     return FOUNDOPT;
  601. }
  602.  
  603. set_name()
  604. {
  605.     char *ptr, *ptr2;
  606.     char nbuf[20+MAXNAMELEN];
  607.  
  608.     if ((ptr = ptr2 = parsestr((char *)NULL, 0, NEXTWORD)) == NULL)
  609.     {
  610.     if (confing)
  611.     {
  612.         (void) printf("name = \"%s\"\n", cuser.cu_cname);
  613.         return TRUE;
  614.     }
  615.  
  616.     return FALSE;
  617.     }
  618.  
  619.     while(*ptr2 != '\0')
  620.     {
  621.     if ((*ptr2 > ' ') && !strchr(",:/", *ptr2))
  622.         ptr2++;
  623.     else
  624.         *ptr2 = '\0';
  625.     }
  626.  
  627.     if (*ptr == '\0')
  628.     {
  629.     if (confing)
  630.     {
  631.         (void)puts("Invalid name given.");
  632.         return TRUE;
  633.     }
  634.  
  635.     return FALSE;
  636.     }
  637.  
  638.     (void) sprintf(nbuf, "Changed name from %s", cuser.cu_cname);
  639.  
  640.     (void) strncpy(cuser.cu_cname, ptr, MAXNAMELEN);
  641.     cuser.cu_cname[MAXNAMELEN-1] = '\0';
  642.     clog.f_usrlen = strlen(cuser.cu_cname) + 1;
  643.  
  644.     if (confing)
  645.     {
  646.     write_log(INFORM, nbuf, (char *)NULL, 0, (unsigned)strlen(nbuf));
  647.     write_usr();
  648.     (void)printf("Name changed to \"%s\"\n", cuser.cu_cname);
  649.     }
  650.  
  651.     return TRUE;
  652. }
  653.  
  654. /*set_integer(name, var)
  655.  *char *name;
  656.  *int *var;
  657.  *{
  658.  *    char *ptr;
  659.  *
  660.  *    if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
  661.  *    *var = atoi(ptr);
  662.  *
  663.  *    (void) printf("%s = %d\n", name, *var);
  664.  *    return FOUNDOPT;
  665.  *}
  666.  */
  667.  
  668. set_ptrstr(name, var)
  669. char *name, **var;
  670. {
  671.     char *ptr;
  672.  
  673.     if ((ptr = parsestr((char *)NULL, 0, NEXTWORD)) != NULL)
  674.     {
  675.     *var = myrealloc(*var, strlen(ptr)+1);
  676.     (void) strcpy(*var, ptr);
  677.     }
  678.  
  679.     (void) printf("%s = \"", name);
  680.     visprnt(*var, stdout);
  681.     (void) puts("\"");
  682.  
  683.     return FOUNDOPT;
  684. }
  685.  
  686. declen(num)
  687. register int num;
  688. {
  689.     register int places = 1;
  690.  
  691.     while ((num /= 10) >= 1)
  692.     ++places;
  693.  
  694.     return places;
  695. }
  696.  
  697. tcapstr(string, var)
  698. char *string, **var;
  699. {
  700.     char tcapbuf[1024];
  701.     char *tmp = tcapbuf;
  702.  
  703.     if (tgetstr(string, &tmp) == NULL)
  704.     *var = NULL;
  705.     else
  706.     {
  707.     *var = myrealloc(*var, tmp-tcapbuf);
  708.     (void) strcpy(*var, tcapbuf);
  709.     }
  710. }
  711. SHAR_EOF
  712. fi # end of overwriting check
  713. #    End of shell archive
  714. exit 0
  715.